import { Request, Response } from 'express';
import User from '../models/User';
import { ICreateUserRequest, IUpdateUserRequest } from '../types';

// 获取所有用户
export const getAllUsers = async (req: Request, res: Response): Promise<void> => {
  try {
    const users = User.findAll();
    res.json({
      success: true,
      message: '获取用户列表成功',
      data: users,
      total: users.length
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: '获取用户列表失败',
      error: error instanceof Error ? error.message : 'Unknown error'
    });
  }
};

// 根据ID获取单个用户
export const getUserById = async (req: Request, res: Response): Promise<void> => {
  try {
    const { id } = req.params;
    if (!id) {
      res.status(400).json({
        success: false,
        message: '用户ID不能为空'
      });
      return;
    }
    const user = User.findById(id);
    
    if (!user) {
      res.status(404).json({
        success: false,
        message: '用户不存在'
      });
      return;
    }

    res.json({
      success: true,
      message: '获取用户信息成功',
      data: user
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: '获取用户信息失败',
      error: error instanceof Error ? error.message : 'Unknown error'
    });
  }
};

// 创建新用户
export const createUser = async (req: Request, res: Response): Promise<void> => {
  try {
    const userData: ICreateUserRequest = req.body;
    
    // 验证数据
    const validationErrors = User.validate(userData);
    if (validationErrors.length > 0) {
      res.status(400).json({
        success: false,
        message: '数据验证失败',
        errors: validationErrors
      });
      return;
    }

    // 检查用户名是否已存在
    const existingUserByUsername = User.findByUsername(userData.username);
    if (existingUserByUsername) {
      res.status(409).json({
        success: false,
        message: '用户名已存在'
      });
      return;
    }

    // 检查邮箱是否已存在
    const existingUserByEmail = User.findByEmail(userData.email);
    if (existingUserByEmail) {
      res.status(409).json({
        success: false,
        message: '邮箱已存在'
      });
      return;
    }

    const newUser = User.create(userData);
    
    res.status(201).json({
      success: true,
      message: '用户创建成功',
      data: newUser
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: '创建用户失败',
      error: error instanceof Error ? error.message : 'Unknown error'
    });
  }
};

// 更新用户
export const updateUser = async (req: Request, res: Response): Promise<void> => {
  try {
    const { id } = req.params;
    if (!id) {
      res.status(400).json({
        success: false,
        message: '用户ID不能为空'
      });
      return;
    }
    const userData: IUpdateUserRequest = req.body;

    // 验证数据
    const validationErrors = User.validate(userData, true);
    if (validationErrors.length > 0) {
      res.status(400).json({
        success: false,
        message: '数据验证失败',
        errors: validationErrors
      });
      return;
    }

    // 检查用户是否存在
    const existingUser = User.findById(id);
    if (!existingUser) {
      res.status(404).json({
        success: false,
        message: '用户不存在'
      });
      return;
    }

    // 如果更新用户名，检查是否与其他用户冲突
    if (userData.username && userData.username !== existingUser.username) {
      const userWithSameUsername = User.findByUsername(userData.username);
      if (userWithSameUsername && userWithSameUsername.id !== parseInt(id, 10)) {
        res.status(409).json({
          success: false,
          message: '用户名已存在'
        });
        return;
      }
    }

    // 如果更新邮箱，检查是否与其他用户冲突
    if (userData.email && userData.email !== existingUser.email) {
      const userWithSameEmail = User.findByEmail(userData.email);
      if (userWithSameEmail && userWithSameEmail.id !== parseInt(id, 10)) {
        res.status(409).json({
          success: false,
          message: '邮箱已存在'
        });
        return;
      }
    }

    const updatedUser = User.update(id, userData);
    
    res.json({
      success: true,
      message: '用户更新成功',
      data: updatedUser
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: '更新用户失败',
      error: error instanceof Error ? error.message : 'Unknown error'
    });
  }
};

// 删除用户
export const deleteUser = async (req: Request, res: Response): Promise<void> => {
  try {
    const { id } = req.params;
    if (!id) {
      res.status(400).json({
        success: false,
        message: '用户ID不能为空'
      });
      return;
    }

    const success = User.delete(id);
    
    if (!success) {
      res.status(404).json({
        success: false,
        message: '用户不存在'
      });
      return;
    }

    res.json({
      success: true,
      message: '用户删除成功'
    });
  } catch (error) {
    res.status(500).json({
      success: false,
      message: '删除用户失败',
      error: error instanceof Error ? error.message : 'Unknown error'
    });
  }
};
